package com.example.stuwork.service;

import com.example.stuwork.common.Result;
import com.example.stuwork.pojo.Assignment;
import com.example.stuwork.dao.AssignmentAllocationStats;

import java.util.List;
import java.util.Map;

/**
 * 作业服务接口
 */
public interface AssignmentService {
    
    /**
     * 获取所有作业列表
     * 
     * @return 作业列表结果
     */
    Result<List<Assignment>> getAllAssignments();
    
    /**
     * 根据ID获取作业详情
     * 
     * @param assignmentId 作业ID
     * @return 作业详情结果
     */
    Result<Assignment> getAssignmentById(Long assignmentId);
    
    /**
     * 根据教师ID获取作业列表
     * 
     * @param teacherId 教师ID
     * @return 作业列表结果
     */
    Result<List<Assignment>> getAssignmentsByTeacherId(String teacherId);
    
    /**
     * 根据教师ID、课程ID和班级ID获取作业列表
     * 
     * @param teacherId 教师ID
     * @param courseId 课程ID
     * @param classId 班级ID
     * @return 作业列表结果
     */
    Result<List<Assignment>> getAssignmentsByTeacherAndCourseAndClass(String teacherId, String courseId, Long classId);
    
    /**
     * 根据课程ID和班级ID获取作业列表
     * 
     * @param courseId 课程ID
     * @param classId 班级ID
     * @return 作业列表结果
     */
    Result<List<Assignment>> getAssignmentsByCourseAndClass(String courseId, Long classId);
    
    /**
     * 添加作业
     * 
     * @param assignment 作业信息
     * @param studentIds 学生ID列表，为空时自动分配给班级所有学生
     * @return 添加结果
     */
    Result<Assignment> addAssignment(Assignment assignment, List<String> studentIds);
    
    /**
     * 更新作业
     * 
     * @param assignment 作业信息
     * @return 更新结果
     */
    Result<Assignment> updateAssignment(Assignment assignment);
    
    /**
     * 删除作业
     * 
     * @param assignmentId 作业ID
     * @return 删除结果
     */
    Result<Boolean> deleteAssignment(Long assignmentId);
    
    /**
     * 获取作业提交统计信息
     * 
     * @param assignmentId 作业ID
     * @return 统计信息结果
     */
    Result<AssignmentAllocationStats> getAssignmentStats(Long assignmentId);
    
    /**
     * 检查作业标题是否已存在
     * 
     * @param courseId 课程ID
     * @param classId 班级ID
     * @param title 作业标题
     * @return 检查结果
     */
    Result<Boolean> checkAssignmentTitleExists(String courseId, Long classId, String title);
    
    /**
     * 获取即将截止的作业
     * 
     * @param days 天数
     * @return 作业列表结果
     */
    Result<List<Assignment>> getUpcomingDeadlines(int days);
    
    /**
     * 获取作业详情并附带提交统计
     * 
     * @param assignmentId 作业ID
     * @return 作业详情及统计信息
     */
    Result<Map<String, Object>> getAssignmentWithStats(Long assignmentId);
    
    /**
     * 根据班级ID获取作业统计信息
     * 
     * @param classId 班级ID
     * @return 作业统计信息列表结果
     */
    Result<List<AssignmentAllocationStats>> getAssignmentStatsByClassId(Long classId);
    
    /**
     * 为班级分配作业
     * 
     * @param assignmentId 作业ID
     * @param classId 班级ID
     * @return 分配结果
     */
    Result<String> allocateAssignmentToClass(Long assignmentId, Long classId);
    
    /**
     * 根据课程ID和班级ID获取作业列表，并包含指定学生的作业状态
     * 
     * @param courseId 课程ID
     * @param classId 班级ID
     * @param studentId 学生ID
     * @return 作业列表结果（包含学生提交状态）
     */
    Result<List<Assignment>> getAssignmentsByCourseAndClassForStudent(String courseId, Long classId, String studentId);
} 